package com.zklh.leetcode.other.problem8;


/**
 * 非正则表达式算法实现
 */
class Solution {

    public int myAtoi(String str) {
        str = str.trim();
        char[] chars = str.toCharArray();
        // 定义盛放数字字符的容器,
        char[] numChars = new char[str.length()];
        // 标记数字的长度
        int numLen = 0;
        // 长度为0, 直接返回0
        if(chars.length == 0){
            return 0;
        }
        // 定义符号位, 用于接收首字母的符号
        int sign = 0;
        // 定义开始遍历字符数组的起始位置
        int beginIndex = 0;
        // 判断首字符是否为 + '-' 或数字
        if(chars[0] == '+' || chars[0] == '-' ||  isNum(chars[0])){
            // 获取符号位
            switch (chars[0]){
                case '+':
                    sign = 1;
                    break;
                case '-':
                    sign = -1;
                    break;
            }
        }else{
            return 0;
        }
        // sign 不为0 说明首字母是符号, 不是数字, 起始索引为1
        if(sign != 0){
            beginIndex++;
        }else{// 为0 则默认为正
            sign = 1;
        }
        for(int i = 0; i+beginIndex < chars.length; i++){
            if(isNum(chars[i+beginIndex])){
                numChars[numLen] = chars[i+beginIndex];
                if(numChars[0] != '0'){
                    numLen++;
                }
            }else{ // 如果不是数字, 停止向下遍历
                break;
            }
        }
        long result = charArr2Num(numChars,numLen);
        result *= sign;
        // 查看result 是否越界
        if( result > Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }else if(result < Integer.MIN_VALUE){
            return Integer.MIN_VALUE;
        }else {
            return (int) result;
        }
    }

    /**
     * 判断当前字符是否是 0 - 9 中的一位
     * @param c
     * @return
     */
    private boolean isNum(char c){
        return c >= '0' && c <= '9';
    }

    /**
     * 将传入的数组, 根据截取长度, 转化成数字, 返回
     * 如果超过边界, 就返回边界值
     * @param numChars
     * @param len len < numChars
     * @return
     */
    private long charArr2Num(char[] numChars, int len){
        long num = 0L;
        if(len > 10){
            return Long.MAX_VALUE;
        }
        for(int i=0; i < len; i++){
            num += (numChars[i] - 48) * (long)(Math.pow(10,len-i-1));
        }
        return num;
    }

    public static void main(String[] args){
        Solution solution = new Solution();
        System.out.println(solution.myAtoi("  0000000000012345678"));
    }
}
